{
qCInfo(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Deleting nested encrypted item" << filename;
- const auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this);
+ const auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), {}, this);
if (_encryptedFolderMetadataHandler && _encryptedFolderMetadataHandler->folderMetadata()
&& _encryptedFolderMetadataHandler->folderMetadata()->isValid()) {
deleteJob->setFolderToken(_encryptedFolderMetadataHandler->folderToken());
Q_LOGGING_CATEGORY(lcDeleteJob, "nextcloud.sync.networkjob.delete", QtInfoMsg)
-DeleteJob::DeleteJob(AccountPtr account, const QString &path, QObject *parent)
+DeleteJob::DeleteJob(AccountPtr account, const QString &path, const QMap<QByteArray, QByteArray> &headers, QObject *parent)
: SimpleFileJob(account, path, parent)
+ , _headers(headers)
{
}
-DeleteJob::DeleteJob(AccountPtr account, const QUrl &url, QObject *parent)
+DeleteJob::DeleteJob(AccountPtr account, const QUrl &url, const QMap<QByteArray, QByteArray> &headers, QObject *parent)
: SimpleFileJob(account, QString(), parent)
+ , _headers(headers)
, _url(url)
{
}
req.setRawHeader("e2e-token", _folderToken);
}
+ for (auto oneHeaderIt = _headers.begin(); oneHeaderIt != _headers.end(); ++oneHeaderIt) {
+ req.setRawHeader(oneHeaderIt.key(), oneHeaderIt.value());
+ }
+
if (_url.isValid()) {
startRequest("DELETE", _url, req);
} else {
{
Q_OBJECT
public:
- explicit DeleteJob(AccountPtr account, const QString &path, QObject *parent = nullptr);
- explicit DeleteJob(AccountPtr account, const QUrl &url, QObject *parent = nullptr);
+ explicit DeleteJob(AccountPtr account, const QString &path, const QMap<QByteArray, QByteArray> &headers = {}, QObject *parent = nullptr);
+ explicit DeleteJob(AccountPtr account, const QUrl &url, const QMap<QByteArray, QByteArray> &headers = {}, QObject *parent = nullptr);
void start() override;
void setFolderToken(const QByteArray &folderToken);
private:
+ QMap<QByteArray, QByteArray> _headers = {};
QUrl _url; // Only used if the constructor taking a url is taken.
QByteArray _folderToken;
};
qCInfo(lcPropagateRemoteDelete) << "Deleting file, local" << _item->_file << "remote" << remoteFilename;
- _job = new DeleteJob(propagator()->account(), propagator()->fullRemotePath(remoteFilename), this);
+ auto headers = QMap<QByteArray, QByteArray>{};
+ if (_item->_locked == SyncFileItem::LockStatus::LockedItem) {
+ headers[QByteArrayLiteral("If")] = (QLatin1String("<") + propagator()->account()->davUrl().toString() + _item->_file + "> (<opaquelocktoken:" + _item->_lockToken.toUtf8() + ">)").toUtf8();
+ }
+ _job = new DeleteJob(propagator()->account(), propagator()->fullRemotePath(remoteFilename), headers, this);
connect(_job.data(), &DeleteJob::finishedSignal, this, &PropagateRemoteDelete::slotDeleteJobFinished);
propagator()->_activeJobList.append(this);
_job->start();
{
qCInfo(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Deleting nested encrypted remote item" << filename;
- auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this);
+ auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), {}, this);
deleteJob->setFolderToken(folderToken());
deleteJob->setProperty(encryptedFileNamePropertyKey, filename);
}
_job = new DeleteJob(propagator()->account(),
- propagator()->fullRemotePath(_item->_file),
- this);
+ propagator()->fullRemotePath(_item->_file),
+ {},
+ this);
connect(qobject_cast<DeleteJob *>(_job), &DeleteJob::finishedSignal, this, &PropagateRemoteMkdir::slotMkdir);
_job->start();
}
qDebug() << "Deleting the current";
auto job = new DeleteJob(propagator()->account(),
- propagator()->fullRemotePath(_fileToUpload._file),
- this);
+ propagator()->fullRemotePath(_fileToUpload._file),
+ {},
+ this);
_jobs.append(job);
connect(job, &DeleteJob::finishedSignal, this, &PropagateUploadFileCommon::slotComputeContentChecksum);
connect(job, &QObject::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed);
// The upload info is stale. remove the stale chunks on the server
_transferId = progressInfo._transferid;
// Fire and forget. Any error will be ignored.
- (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), this))->start();
+ (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), {}, this))->start();
// startNewUpload will reset the _transferId and the UploadInfo in the db.
}
// Wipe the old chunking data.
// Fire and forget. Any error will be ignored.
- (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), this))->start();
+ (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), {}, this))->start();
propagator()->_activeJobList.append(this);
startNewUpload();
// we should remove the later chunks. Otherwise when we do dynamic chunk sizing, we may end up
// with corruptions if there are too many chunks, or if we abort and there are still stale chunks.
for (const auto &serverChunk : std::as_const(_serverChunks)) {
- auto job = new DeleteJob(propagator()->account(), Utility::concatUrlPath(chunkUploadFolderUrl(), serverChunk.originalName), this);
+ auto job = new DeleteJob(propagator()->account(), Utility::concatUrlPath(chunkUploadFolderUrl(), serverChunk.originalName), {}, this);
QObject::connect(job, &DeleteJob::finishedSignal, this, &PropagateUploadFileNG::slotDeleteJobFinished);
_jobs.append(job);
job->start();
if (!transferId)
continue; // Was not a chunked upload
QUrl url = Utility::concatUrlPath(account()->url(), QLatin1String("remote.php/dav/uploads/") + account()->davUser() + QLatin1Char('/') + QString::number(transferId));
- (new DeleteJob(account(), url, this))->start();
+ (new DeleteJob(account(), url, {}, this))->start();
}
}
}